// aiserve/tongyi.go
package aiserve

import (
	"context"
	"encoding/json"
	"fmt"
	"net/http"
	"strings"
	"time"

	models "yuanaiproblem/dao/model"
	"yuanaiproblem/migrations/db"
	"yuanaiproblem/utils"
)

// TongyiAIService 通义千问AI服务（实现AIService接口）
type TongyiAIService struct {
	config AIConfig // 持有通用配置
	client *http.Client
}

// NewTongyiAIService 基于通用配置创建通义千问服务实例
func NewTongyiAIService(config AIConfig) *TongyiAIService {
	return &TongyiAIService{
		config: config,
		client: &http.Client{},
	}
}

// GenerateQuestions 实现AIService接口（适配Question实体）
func (s *TongyiAIService) GenerateQuestions(prompt string, count int, userId int32) ([]models.Question, error) {
	// 构建标准化提示词
	fixedPrompt := utils.BuildFixedPrompt(prompt)

	// 使用配置参数构建请求体
	reqBody := map[string]interface{}{
		"model":       s.config.Model,
		"temperature": s.config.Temperature,
		"max_tokens":  s.config.MaxTokens,
		"messages": []map[string]string{{
			"role":    "user",
			"content": fixedPrompt,
		}},
	}

	// 序列化请求体
	reqJSON, err := json.Marshal(reqBody)
	if err != nil {
		return nil, fmt.Errorf("请求序列化失败: %w", err)
	}

	// 超时控制（从配置获取）
	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(s.config.Timeout)*time.Second)
	defer cancel()

	// 创建HTTP请求
	req, err := http.NewRequestWithContext(
		ctx,
		http.MethodPost,
		s.config.BaseURL,
		strings.NewReader(string(reqJSON)),
	)
	if err != nil {
		return nil, fmt.Errorf("创建请求失败: %w", err)
	}

	// 设置请求头（认证信息从配置获取）
	req.Header.Set("Authorization", "Bearer "+s.config.APIKey)
	req.Header.Set("Content-Type", "application/json")

	// 发送请求
	resp, err := s.client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("通义千问API调用失败: %w", err)
	}
	defer resp.Body.Close()

	// 解析响应体
	var respBody struct {
		Choices []struct {
			Message struct {
				Content string `json:"content"`
			} `json:"message"`
		} `json:"choices"`
	}
	if err := json.NewDecoder(resp.Body).Decode(&respBody); err != nil {
		return nil, fmt.Errorf("解析响应失败: %w", err)
	}
	if len(respBody.Choices) == 0 {
		return nil, fmt.Errorf("通义千问未返回有效内容")
	}

	// 解析响应并映射到Question实体
	questions, err := utils.ParseAndMapResponse(respBody.Choices[0].Message.Content, s.config.Model, userId)
	if err != nil {
		return nil, err
	}
	// 查询数据库中question表的最大ID并加1，作为起始值
	var startID int64
	query := "SELECT COALESCE(MAX(id), 0) + 1 FROM questions"
	if err := db.DB.Raw(query).WithContext(ctx).Scan(&startID).Error; err != nil {
		return nil, fmt.Errorf("查询起始ID失败: %v", err)
	}
	// 批量分配连续ID
	for i := range questions {
		questions[i].ID = int(startID)
		startID++
	}
	// 调整题目数量
	return utils.AdjustQuestionCount(questions, count), nil
}
